Problem
曼哈顿最小生成树
Description
平面坐标系内,给定个顶点。对于顶点,与之间的距离定义为。你的任务是求出这个顶点的最小生成树。
Input
第一行一个正整数,表示定点个数。
接下来行每行两个正整数,描述一个顶点。
Output
Sample Input
1 | 4 |
Sample Output
1 | 6 |
HINT
对于的数据,。
标签:树状数组
MST
Solution
裸题。
对于曼哈顿最小生成树,直接建边肯定是不行的,考虑优化建边,去掉一些一定不会在中的边。
考虑一个点,以为中心将整个图分为个部分。
对于一个在右上角的点,一定有,若其使最小,则所有在右上角的点的曼哈顿距离都没有小。因此在右上角的所有点中,只连即可。同理在周围的八个方向中,每个方向只需连曼哈顿距离最小的点。
对于如何寻找这样的点,拿找右上角的最近点做例子:
最近的点一定使最小,即使最小。同时要满足,即满足。可以发现这就是以为第一维,为第二维做偏序,找到符合的位置中的最小值,用维护。
这样我们就可以连每个点到其右上角的最近点的边了。考虑到边可以每次都连双向,因此每个点只用枚举一半即可。这里默认向坐标比当前点大的点连边。其实是可以把每种情况都转化为右上角的。
一开始的时候,我们总共需要考虑的是下图区域中的最近点。第一次连边将中的最近点连边。
接下来将每个点的坐标互换,即关于直线对称,可以得到下图。第二次连边将中的最近点连边。
然后将每个点的坐标取反,即可得到下图。这时第三次连边将中的最近点连边。
最后再次互换每个点的坐标,得到下图。第四次连边将中的最近点连边。
由此,我们可以不改回原值就将个方向连边。
建图后,直接跑或即可。
Code
1 |
|